今天要來講的是MVP架構,架構是非常重要的,因為當你的程式越做越大時就會變得非常雜亂,這時只要有用架構好好分類,不管是對日後的維護或是有其他的人閱讀你的程式碼,都會比較淺顯易懂。而架構不只有MVP還有其他種類,下面就好好和你分享!!!!
M-負責處理與資料相關的事情。
V-負責處理與介面相關的事情。
C-介於View及Model之間的橋樑
這裡的M和V和上面MVC是一樣的。
而Presenter則是擔任View及Model之間的橋樑,和負責邏輯處理的部分。
相對比較難講這邊先跳過。
推薦 MVVM > MVP > MVC
困難 MVVM > MVP > MVC
下面是我彙整的一張流程圖,可以參考一下。
這邊我設計了簡易的登入系統,在MainActivity先拿取登入資料,然後在Presenter做帳密判斷,如果帳密錯誤就叫View顯示Toast,如果帳密正確,到Modle拿取登入著資料,之後傳回給Presenter,最後再傳回給View顯示。
//在後面加入implements
public class MainActivity extends AppCompatActivity implements Contract.view{
//設定變數
private EditText account;
private EditText password;
private Button sent;
private Context context=this;
private Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定元件
account=(EditText) findViewById(R.id.editTextTextPersonName);
password=(EditText) findViewById(R.id.editTextTextPassword);
sent=(Button) findViewById(R.id.button);
//New出Presenter,並把自己丟入。
presenter=new Presenter(this);
}
//當按下送出按鈕,拿取password和account給presente。
public void sentOnClick(View view){
presenter.getLoginData(account.getText().toString(),password.getText().toString());
}
//當presente判斷帳密輸入錯誤,呼叫此方法。
@Override
public void loginError() {
Toast.makeText(context,"帳密錯誤",Toast.LENGTH_LONG).show();
}
//當presente判斷帳密輸入正確,呼叫此方法。
@Override
public void showUserName(String userName) {
Toast.makeText(context,"歡迎登入"+userName,Toast.LENGTH_LONG).show();
}
}
public class Presenter implements Contract.presenter{
//設定變數
private Contract.view callBake;
private String userName;
private Modle modle;
public Presenter(Contract.view view) {
//接收View。
this.callBake=view;
//New出Modle,並把自己丟入。
modle=new Modle(this);
}
@Override
public void getLoginData(String password, String account) {
//登入正確,
if(password.equals("0000")&&account.equals("1111")) {
//到Modle拿取登入人員資料。
userName = modle.getUserName();
//再傳回view,叫view更新畫面。
callBake.showUserName(userName);
}
//登入錯誤。
else
callBake.loginError();
}
}
public class Modle implements Contract.modle{
private Contract.presenter callBake;
public Modle(Contract.presenter presenter) {
//接收presenter
this.callBake=presenter;
}
//回傳登入人員資料
@Override
public String getUserName() {
return "Chocolee";
}
}
在 interface Contract 是用來讓Presenter,View,Modle互相溝通。
並在 interface Contract新增三個interface,並新增他們的方法。
public interface Contract {
interface view{
void loginError();
void showUserName(String userName);
}
interface presenter{
void getLoginData(String password,String account);
}
interface modle{
String getUserName();
}
}